home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Texty / crackme / id5-lu48-fr.txt < prev    next >
Encoding:
Text File  |  1999-05-29  |  28.5 KB  |  704 lines

  1.  
  2.         ---------------------------------------------------
  3.         -------    Immortal Descandants CrackMe 5.0 ----------
  4.         ------- by TORN@DO, tutorial by Lucifer48 ---------
  5.         ---------------------------------------------------
  6.  
  7.  
  8. Je m'excuse par avance; mais ce tutorial est assez embrouillΘ. Bonne lecture tout de mΩme!
  9.  
  10. ================================================
  11. 1. INTRODUCTION - PARTIE 1/2 - LE NOM DU FICHIER
  12. ================================================
  13.  
  14. C'est la premiΦre chose α savoir. Je propose deux solutions:
  15. la premiΦre (la plus simple est d'utiliser filemon):
  16. on obtient le rΘsultat suivant:
  17.  
  18. 197    20:13:44    Idcrkme5    Open    C:\REGISTRATION.DAT    NOTFOUND    OPENEXISTING OPENALWAYS
  19. 198    20:13:44    Idcrkme5    Open    C:\REGISTRATION.DAT    NOTFOUND    OPENEXISTING OPENALWAYS
  20.  
  21. Remarque: la vΘrification du fichier est faite deux fois.
  22.  
  23. Mais une meilleure mΘthode qui va nous permette: d'une part d'obtenir le nom du fichier,
  24. et d'autre pouvoir analyser quel contenu mettre dans ce fichier.
  25. Pour τa dans soft-ice je mets un BPX CreateFileA, nous somme ici:
  26.  
  27. XXXX:00409B1B  PUSH EAX                          ;80000000 (GENERIC_READ)
  28. XXXX:00409B1C  MOV  EBP,[KERNEL32!CreateFileA]
  29. XXXX:00409B22  PUSH ECX                          ;REGISTRATION.DAT
  30. XXXX:00409B23  CALL EBP                          ;CALL [KERNEL32!CreateFileA]
  31. XXXX:00409B25  CMP  EAX,-01                      ;EAX=-1 : fichier non trouvΘ
  32. XXXX:00409B28  MOV  EBP,EAX                      ;handle du fichier
  33. XXXX:00409B2A  JNZ  00409B48
  34.  
  35. Donc je cree le fichier REGISTRATION.DAT et on peut continuer en 00409B48.
  36.  
  37. =================================================
  38. 2. INTRODUCTION - PARTIE 2/2 - PERDU DANS LE CODE
  39. =================================================
  40.  
  41. XXXX:00409B48  PUSH EBP                          ;sauvegarde l'handle du fichier
  42. XXXX:00409B49  CALL [KERNEL32!GetFileType]
  43. XXXX:00409B4F  TEST EAX,EAX
  44. XXXX:00409B51  JNZ  00409B76
  45. XXXX:00409B53  PUSH EBP                          ;handle du fichier
  46. XXXX:00409B54  CALL [KERNEL32!CloseHandle]       ;fermeture du fichier
  47. ...ce n'est la bonne voix a empreinter pour rΘussir le crackme. Fuyons KERNEL32!CloseHandle
  48. comme la peste!
  49.  
  50. Lα on se rend compte qu'on est dans les mΘandres de la compilation Vc++ et qu'il bidouille
  51. toutes sortes de trucs qui m'Θchappent. AprΦs quelques "^p ret" (touche F12); tout devient clair:
  52.  
  53. XXXX:00401ABE  PUSH  0040D724                     ;quelques datas
  54. XXXX:00401AC3  PUSH  ECX
  55. XXXX:00401AC4  CALL  004053C0                     ;on sort d'ici
  56. XXXX:00401AC9  ADD   ESP,08                       ;pop-pop
  57. XXXX:00401ACC  MOV   ESI,EAX
  58. XXXX:00401ACE  TEST  ESI,ESI                      ;si REGISTRATION.DAT n'existe pas ESI=0
  59. XXXX:00401AD0  JZ    00401B76                     ;aller en 00401B76 n'est pas la bonne voie
  60.  
  61. [...]
  62. plusieurs de code mal compilΘ... entre elles, il y a la lecture du contenu de notre fichier
  63. [...]
  64.  
  65. XXXX:00401B6A  XOR  EAX,EAX                       ;ici nous somme sur la bonne voie
  66. XXXX:00401B6C  POP  EDI
  67. XXXX:00401B6D  POP  ESI
  68. XXXX:00401B6E  POP  EBX
  69. XXXX:00401B6F  ADD  ESP,00000864                  ;wow! pop-pop-...-pop-pop
  70. XXXX:00401B75  RET
  71. XXXX:00401B76  MOV  EAX,00000001
  72. XXXX:00401B7B  POP  EDI
  73. XXXX:00401B7C  POP  ESI
  74. XXXX:00401B7D  POP  EBX
  75. XXXX:00401B7E  ADD  ESP,00000864                  ;wow! pop-pop-...-pop-pop
  76. XXXX:00401B84  RET
  77.  
  78. Nous somme ici (on n'est dans procedure principale):
  79.  
  80. XXXX:00401B92  CALL 00401A30                      ;<--- on sort d'ici
  81. XXXX:00401B97  ADD  ESP,04                        :pop-pop
  82. XXXX:00401B9A  PUSH 00
  83. XXXX:00401B9C  CALL 00401340
  84. XXXX:00401BA1  ADD  ESP,04                        ;pop-pop
  85. XXXX:00401BA4  PUSH 00
  86. ...
  87. XXXX:00401BFE  CALL 00401DC0
  88. XXXX:00401C03  ADD  ESP,04                        ;pop-pop
  89. XXXX:00401C06  TEST EAX,EAX
  90. XXXX:00401C08  JZ   00401D18                      ;on ne doit pas jumper
  91. XXXX:00401C0E  PUSH 00
  92. XXXX:00401C10  CALL 00401A30
  93. XXXX:00401C15  ADD  ESP,04                        ;pop-pop
  94. XXXX:00401C18  TEST EAX,EAX
  95. XXXX:00401C1A  JZ   00401D18                      ;non pas par lα :)
  96. XXXX:00401C20  PUSH 00
  97. XXXX:00401C22  CALL 00401E90
  98. ...
  99. et ainsi de suite, il y a 17 call α explorer pour arriver α la fin, le schema est
  100. toujours le mΩme:
  101.     push  00
  102.     call  x
  103.     add   esp,04
  104.     test  eax,eax
  105.     j(n)z mauvais_keyfile
  106. ...
  107. XXXX:00401CFE  CALL 00403190
  108. XXXX:00401D03  ADD  ESP,04
  109. XXXX:00401D06  TEST EAX,EAX
  110. XXXX:00401D08  JZ   00401D18                     ;perdu!
  111. XXXX:00401D0A  MOV  EAX,[ESP+04]
  112. XXXX:00401D0E  PUSH EAX
  113. XXXX:00401D0F  CALL 004012E0                     ;on a un bon keyfile hourra!
  114. XXXX:00401D14  ADD  ESP,04                       ;pop-pop
  115. XXXX:00401D17  RET
  116. XXXX:00401D18  MOV  EAX,[ESP+04]
  117. XXXX:00401D1C  PUSH EAX
  118. XXXX:00401D1D  CALL 00401290                     ;notre keyfile n'est pas bon.
  119. XXXX:00401D22  ADD  ESP,04                       ;pop-pop
  120. XXXX:00401D25  RET
  121.  
  122. On sait maintenant ce qui nous reste α faire: explorer 17 call (thanks Torn@do) pour gΘnΘrer
  123. un bon keyfile. C'est maintenant le crackme commence.
  124.  
  125.  
  126. ==================================================
  127. 3. PARTIE 01/17 - CALL 00401DC0 (en XXXX:00401BFE)
  128. ==================================================
  129.  
  130. Etant donnΘ que chaque call est "structurΘ" de la mΩme faτon, je ne m'interresserais pas au
  131. dΘbut du call (il teste toujours les mΩme trucs... le fichier existe-t-il?? heureusement sinon on
  132. serai pas lα!). L'intΘressant (ce que nous a concoctΘ torn@do) de chaque call se situe α la fin
  133. de la procΘdure, ainsi:
  134.  
  135. XXXX:00401E56  PUSH EAX                          ;le contenu de notre keyfile
  136. XXXX:00401E57  CALL 00405240                     ;calcule de la taille du keyfile
  137. XXXX:00401E5C  ADD  ESP,10
  138. XXXX:00401E5F  MOV  EBX,EAX                      ;EBX contient la taille de notre keyfile
  139. ...
  140. XXXX:00401E6A  SUB  EBX,00000400                 ;400h = 1024d
  141. XXXX:00401E70  POP  EDI
  142. XXXX:00401E71  POP  ESI
  143. XXXX:00401E72  CMP  EBX,01
  144. XXXX:00401E75  SBB  EAX,EAX                      ;soustrait 1 si la retenue est α 1 (CF=1)
  145. XXXX:00401E77  POP  EBX
  146. XXXX:00401E78  NEG  EAX                          ;NEG FFFFFFFF = 00000001
  147. XXXX:00401E7A  ADD  ESP,00000800
  148. XXXX:00401E80  RET                               ;fin du call 00401DC0
  149.  
  150. Pour passer ce call on doit avoir un keyfile de taille 1024 octets.
  151.  
  152. Remarque: si on regarde plus en profondeur le call qui calcul la taille du keyfile on se rend
  153. compte qu'il y a deux petites exceptions:
  154.                     contenu (exemple d'un keyfile avec 4 octets):
  155. REGISTRATION.DAT    31 32 33 34       le call 00405240 renvoit EAX=00000004
  156. REGISTRATION.DAT    31 1A 33 34       le call 00405240 renvoit EAX=00000001
  157. REGISTRATION.DAT    31 0D 0A 34       le call 00405240 renvoit EAX=00000003
  158.                                       (chaque 0D est enlevΘ)
  159.  
  160. Je m'enpresse donc je crΘer un fichier de 1024 octets.
  161.  
  162.  
  163. ===============
  164. 4. LA SURPRISE!
  165. ===============
  166.  
  167. VERSION 1:
  168. ----------
  169. Je relance le crackme, est lα surprise!!! **boom** je reτois une erreur (page fault).
  170. AprΦs plusieurs essais, j'en conclus que si le keyfile est supΘrieur α 188 octets alors on
  171. recoit une page fault sinon τa passe.
  172. J'avoue que au dΘbut j'ai VRAIMENT cru qu'il y avait un bug! J'ai donc mail-Θ torn@do pour lui
  173. demander, il m'a rΘpondu qu'il n'y avait pas de bug.
  174.  
  175. Je pensais sincΦrement qu'il y avait un bug, jusqu'α l'instant ou j'ai pris la dΘcision d'aller
  176. chercher ou se situe l'erreur.
  177.  
  178. XXXX:00401B92  CALL 00401A30
  179. XXXX:00401B97  ADD  ESP,04                        :pop-pop
  180. XXXX:00401B9A  PUSH 00
  181. XXXX:00401B9C  CALL 00401340                      ;PAGE FAULT ICI!
  182. XXXX:00401BA1  ADD  ESP,04                        ;pop-pop
  183.  
  184. En fait, la pile est remplie avec le contenu de notre keyfile (τa, je ne l'ai pas vu tout de suite)
  185. et donc pour que tout marche, α un certain endroit de notre keyfile, doit se situer la bonne
  186. adresse de retour du call 00401340 (c'est α dire: 00401BA1).
  187.  
  188. Tout α la fin du call 00401340 (aprΦs l'instruction add esp,20) si on fait d ESP, on s'apercoit
  189. qu'on est en plein dans le keyfile (pour moi c'est XOR 67).
  190. Deplus: 00401340 XOR 67676767 = 67277427
  191.  
  192. 000000B0 ?? ?? ?? ?? ?? ?? ?? ??-?? 67 27 74 27 ?? ?? ??    .........g't'...
  193.  
  194. Plus de page fault, on peut continuer.
  195.  
  196. VERSION 2: La version 1 n'est pas la bonne mΘthode car, le crackme s'attendait α un octet 00
  197. ---------- On a pas a mettre l'adresse de retour du call dans le keyfile.
  198.            lire la partie suivante pour mieux comprendre.
  199.  
  200.  
  201. ==================================================
  202. 5. PARTIE 02/17 - CALL 00401A30 (en XXXX:00401C10)
  203. ==================================================
  204.  
  205. Au dΘbut j'ai d'abord pensΘ qu'il n'y avait rien α faire dans ce call, et ensuite j'ai dΘcouvert
  206. que c'Θtait l'endroit ou il fabriquait, le nom dans la messagebox "request"
  207.  
  208. ...
  209. XXXX:00401B3A  NOT  ECX
  210. XXXX:00401B3C  DEC  ECX                           ;taille de notre "zone de nom"
  211. XXXX:00401B3D  XOR  BL,CL                         ;BL un caractΦre du keyfile
  212. XXXX:00401B3F  MOV  ECX,FFFFFFFF
  213. XXXX:00401B44  SUB  EAX,EAX
  214. XXXX:00401B46  MOV  [EDX+0040D186],BL             ;sauvegarde du caractΦre xorisΘ
  215. ...
  216.  
  217. Exemple avec mon nom, je veux Θcrire "Lucifer48"
  218.  
  219. 00000090 ?? ?? ?? ?? ?? ?? ?? ??-?? p1 p2 p3 p4 p5 p6 p7    ................
  220. 000000A0 p8 p9 00 ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??    ................
  221.  
  222. On doit (ABSOLUMENT) mettre un octet zΘro α la fin, et chaque caractΦre est obtenue via un XOR
  223. de la taille du nom (ici 9). Ansi Lucifer48 devient: 45 7C 6A 60 6F 6C 7B 3D 31
  224.  
  225. L'octet 00 est trΦs trΦs important, au dΘbut je l'avais pas mis, mais plus tard, comme le
  226. crackme se sert de τa comme repΦre (REPNZ SCASB), j'ai rencontrΘ quelques problΦmes. Dans mon
  227. cas, au dΘbut, il croyait que mon nom faisait 67h, et j'ai eu beaucoup de problΦmes par la
  228. suite (τa dΘbordait dans la pile....).
  229.  
  230. L'icone du crackme (en haut α gauche!) est toujours un cadena ...
  231.  
  232.  
  233. ==================================================
  234. 6. PARTIE 03/17 - CALL 00401E90 (en XXXX:00401C22)
  235. ==================================================
  236.  
  237. XXXX:00401F47  MOV  DL,[EAX+0040D0F0]             ;EAX est initialement nul
  238. XXXX:00401F4D  CMP  [EAX+ESP+38],DL               ;comparaison avec notre valeur dans le keyfile
  239. XXXX:00401F51  JNZ  00401F73                      ;si non Θgal on quitte (dommage)
  240. XXXX:00401F53  MOV  DWORD PTR [0040D0B4],00000001 ;youpi une nouvelle icone!
  241. XXXX:00401F5D  INC  CX
  242. XXXX:00401F5F  CMP  CX,09
  243. XXXX:00401F63  JLE  00401F44
  244. XXXX:00401F65  MOV  EAX,00000001                  ;si on passe par lα, c'est bon
  245. ...
  246. XXXX:00401F72  RET
  247.  
  248. On va donc recopier dans notre keyfile les 10 octets qu'il demande. Donc:
  249.  
  250. 00000000 06 0A 15 07 13 10 0A 72-0C 00 ?? ?? ?? ?? ?? ??    .......r........
  251.  
  252. On a passΘ ce call, le cadena c'est transformΘ en tΩte de mort :) τa prouve qu'on avance.
  253.  
  254.  
  255. ==================================================
  256. 7. PARTIE 04/17 - CALL 00401F80 (en XXXX:00401C34)
  257. ==================================================
  258.  
  259. Pour pouvoir continuer, on doit sortir de ce call avec EAX=0.
  260.  
  261. XXXX:0040210C  MOV  DWORD PTR [0040D0B4],00000002 ;encore une nouvelle icone!
  262. XXXX:00402116  XOR  EAX,EAX
  263. XXXX:00402118  POP  EBP
  264. XXXX:00402119  POP  EDI
  265. XXXX:0040211A  POP  ESI
  266. XXXX:0040211B  POP  EBX
  267. XXXX:0040211C  ADD  ESP,00000800
  268. XXXX:00402122  RET                                ;fin du call 00401F80
  269.  
  270. Auparavant, il y a quelques xorifications avec une partie de notre keyfile, c'est trΦs facile α
  271. comprendre. Pour arriver α eax=0, on doit passer quelques comparaisons
  272. (CMP BL,53 / CMP EAX,6F / CMP ECX,66 / CMP EDX,70 / CMP ESI,49 / CMP EDI,43 / CMP EBP,45)
  273. Dans le keyfile, on aura:
  274.  
  275. 00000000 ** ** ** ** ** ** ** **-** ** 07 20 34 3E 09 07    ........... 4>..
  276. 00000010 0A ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??    ................
  277.  
  278. Remarque: pour ceux qui n'auraient pas compris, "**" signifie que cet octet a dΘjα ΘtΘ trouvΘ
  279. dans un call prΘcΘdent (voir plus haut), et que "??" est un octet encore non dΘterminΘ.
  280.  
  281. La nouvelle icone est une croix!
  282.  
  283.  
  284. ==================================================
  285. 8. PARTIE 05/17 - CALL 00402130 (en XXXX:00401C46)
  286. ==================================================
  287.  
  288. Pour passer ce call on doit sortir avec EAX=1
  289.  
  290. XXXX:00402241  MOV  DWORD PTR [0040D0B4],00000003 ;une nouvelle icone
  291. XXXX:0040224B  MOV  EAX,00000001
  292. XXXX:00402250  POP  EBP
  293. XXXX:00402251  POP  EDI
  294. XXXX:00402252  POP  ESI
  295. XXXX:00402253  POP  EBX
  296. XXXX:00402254  ADD  ESP,00000800
  297. XXXX:0040225A  RET                                ;fin du call 00402130
  298.  
  299. Il y a quatres comparaisons:
  300.  
  301. XXXX:004021DA  MOVSX ESI,BYTE PTR [ESP+55]        ;(cmp ESI,08)
  302. XXXX:004021DF  MOVSX EDI,BYTE PTR [ESP+56]        ;(test EDI,EDI)
  303. XXXX:004021E4  MOVSX EBX,BYTE PTR [ESP+57]        ;(test EBX,EBX)
  304. XXXX:004021E9  MOVSX EBP,BYTE PTR [ESP+58]        ;(cmp EBP,05)
  305.  
  306. Finalement:
  307. 00000010 ** 08 00 00 05 ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??    ................
  308.  
  309. La nouvelle icone est une tΩte jaune qui fait la gueule.
  310.  
  311.  
  312. ==================================================
  313. 9. PARTIE 06/17 - CALL 00402260 (en XXXX:00401C58)
  314. ==================================================
  315.  
  316. Voilα la bonne sortie:
  317.  
  318. XXXX:00402597  MOV  DWORD PTR [0040D0B4],00000004 ;nouvelle icone
  319. XXXX:004025A1  XOR  EAX,EAX
  320. XXXX:004025A3  POP  EBP
  321. XXXX:004025A4  POP  EDI
  322. XXXX:004025A5  POP  ESI
  323. XXXX:004025A6  POP  EBX
  324. XXXX:004025A7  ADD  ESP,00000834
  325. XXXX:004025AD  RET                                ;fin du call 00402260
  326.  
  327. On a 17 nouveaux octets α trouver, voilα un petit rΘcapitulatif:
  328. Soient b0, b1, ...,bG les 17 octets. Ainsi:
  329.  
  330. b0 OR 56   ebx       =5E      |    b9 OR 53  [esp+24]  =7F
  331. b1 OR 49   [esp+10]  =4D      |    bA OR 20  [esp+28]  =63
  332. b2 OR 53   [esp+14]  =53      |    bB OR 53  [esp+2C]  =5B
  333. b3 OR 49   ebp       =5B      |    bC OR 49  [esp+30]  =4B
  334. b4 OR 54   esi       =5E      |    bD OR 54  [esp+34]  =7E
  335. b5 OR 20   edi       =32      |    bE OR 45  [esp+38]  =4F
  336. b6 OR 54   [esp+18]  =57      |    bF OR 21  [esp+40]  =65
  337. b7 OR 48   [esp+1C]  =5A      |    bG OR 21  [esp+44]  =75
  338. b8 OR 49   [esp+20]  =4B      |
  339.  
  340. La il peut y avoir de nombreuses possibilitΘs. Je vais n'en choisir qu'une seule:
  341. (rΘsultat XOR masque)
  342.  
  343. RΘsultat dans le keyfile:
  344.  
  345. 00000010 ** ** ** ** ** 08 04 00-12 0A 12 03 12 02 2C 43    ..............,C
  346. 00000020 08 02 2A 0A 44 54 ?? ??-?? ?? ?? ?? ?? ?? ?? ??    ..*.DT..........
  347.  
  348.  
  349. ===================================================
  350. 10. PARTIE 07/17 - CALL 004025B0 (en XXXX:00401C6A)
  351. ===================================================
  352.  
  353. Le call utilise les quatres octets suivant:
  354.  
  355. 00000050 X1 X2 X3 X4 ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??    ................
  356.  
  357. A un moment y'a une comparaison:
  358.  
  359. XXXX:004026EB  CMP  DWORD PTR [0040EA98],04       ;DWORD PTR [0040EA98] = 000000X2
  360. XXXX:004026F2  MOV  [0040EA9C],EAX
  361. XXXX:004026F7  JAE  0040271A
  362.  
  363. Y'a ensuite appel α GetLocalTime (il se sert de l'annΘe). Il fabrique un sorte de checksum avec
  364. ces 4 octets, est compare avec 1999, j'ai pas tout compris ;) Ensuite:
  365.  
  366.  
  367. XXXX:00402751  MOV  DWORD PTR [0040D0B4],00000005 ;nouvelle icone
  368. XXXX:0040275B  XOR  EAX,EAX
  369. ...
  370. XXXX:00402775  MOV  EAX,00000001
  371. XXXX:0040277A  POP  EDI
  372. XXXX:0040277B  POP  ESI
  373. XXXX:0040277C  ADD  ESP,00000814
  374. XXXX:00402782  RET                                ;fin du call 004025B0
  375.  
  376. J'ai mis X1=X2=X3=X4=FF et τa marche, j'ai pas trop cherchΘ α comprendre pourquoi et j'ai
  377. continuΘ.
  378.  
  379. La nouvelle icone est une tΩte jaune ronde (avec la bouche en forme de "o").
  380.  
  381.  
  382. ===================================================
  383. 11. PARTIE 08/17 - CALL 00402790 (en XXXX:00401C7C)
  384. ===================================================
  385.  
  386. On doit sortir avec EAX=1. C'est trΦs simple:
  387.  
  388. XXXX:0040283E  MOVSX EAX,BYTE PTR [ESP+00000091]  ;un caractΦre de notre keyfile
  389. XXXX:00402846  MOVSX ECX,BYTE PTR [ESP+00000090]  ;un autre caractΦre du keyfile
  390. XXXX:0040284E  ADD  ESP,04
  391. XXXX:00402851  MOV  [0040EA88],EAX
  392. XXXX:00402856  CMP  ECX,17
  393. XXXX:00402859  JA   00402884                      ;mauvais saut
  394. XXXX:0040285B  CMP  EAX,3B
  395. XXXX:0040285E  JA   00402884                      ;mauvais saut
  396. XXXX:00402860  MOV  DWORD PTR [0040D0B4],00000005 ;une nouvelle icone
  397. ...
  398. XXXX:0040287E  MOV  EAX,00000001
  399. XXXX:00402883  RET                                ;fin du call 00402790
  400.  
  401. Dans le keyfile:
  402. 00000050 ** ** ** ** 17 3B ?? ??-?? ?? ?? ?? ?? ?? ?? ??    .....;..........
  403.  
  404.  
  405. ===================================================
  406. 12. PARTIE 09/17 - CALL 004028A0 (en XXXX:00401C8E)
  407. ===================================================
  408.  
  409. XXXX:00402952  MOVSX EAX,SI                       ;SI=0001
  410. XXXX:00402958  MOV  CL,[EAX+0040D0FF]             ;datas du crackme
  411. XXXX:0040295E  CMP  [EAX+ESP+00000107],CL         ;comparaison avec le contenu de notre keyfile
  412. XXXX:00402965  JNZ  00402987                      ;il faut que τa soit Θgal
  413. XXXX:00402967  INC  SI
  414. XXXX:00402969  CMP  SI,58                         ;58h = 88d
  415. XXXX:0040296D  JLE  0040294B                      ;boucle
  416. XXXX:0040296F  MOV  DWORD PTR [0040D0B4],00000007 ;nouvelle icone
  417. XXXX:00402979  MOV  EAX,00000001
  418. XXXX:0040297E  POP  EDI
  419. XXXX:0040297F  POP  ESI
  420. XXXX:00402980  ADD  ESP,00000800
  421. XXXX:00402986  RET                                ;fin du call 004028A0
  422.  
  423. On rajoute dans le keyfile:
  424.  
  425. 000000D0 53 55 50 50 4F 52 54 20-54 48 45 20 53 4F 46 54    SUPPORT THE SOFT
  426. 000000E0 57 41 52 45 20 41 55 54-48 4F 52 53 20 42 59 20    WARE AUTHORS BY 
  427. 000000F0 42 55 59 49 4E 47 20 54-48 45 20 50 52 4F 47 52    BUYING THE PROGR
  428. 00000100 41 4D 53 20 49 46 20 59-4F 55 20 55 53 45 20 54    AMS IF YOU USE T
  429. 00000110 48 45 4D 20 41 46 54 45-52 20 43 52 41 43 4B 49    HEM AFTER CRACKI
  430. 00000120 4E 47 20 54 48 45 4D 21-?? ?? ?? ?? ?? ?? ?? ??    NG THEM!........
  431.  
  432. L'icone a changΘe, c'est maintenant (toujours une tΩte jaune) mais elle ouvre la boucle...
  433.  
  434.  
  435. ===================================================
  436. 13. PARTIE 10/17 - CALL 004029A0 (en XXXX:00401C9C)
  437. ===================================================
  438.  
  439. XXXX:00402A68  MOVSX EAX,SI
  440. XXXX:00402A6B  ADD  ESP,04
  441. XXXX:00402A6E  MOV  CL,[EAX+0040D1C7]             ;datas
  442. XXXX:00402A74  CMP  [EAX+ESP+00000187],CL         ;comparaisons avec notre keyfile
  443. XXXX:00402A7B  JNZ  00402AAC                      ;ne surtout pas empreinter ce jump
  444. XXXX:00402A7D  INC  SI
  445. XXXX:00402A7F  MOV  EDI,0040D1C8                  ;datas, immΘdiatement suivis par un bout du
  446. XXXX:00402A84  MOV  ECX,FFFFFFFF                  ; contenu du keyfile
  447. XXXX:00402A89  SUB  EAX,EAX
  448. XXXX:00402A8B  REPNZ SCASB                        ;dΘtermine la longueur de la chaεne
  449. XXXX:00402A8D  MOVSX EAX,SI
  450. XXXX:00402A90  NOT  ECX
  451. XXXX:00402A92  DEC  ECX
  452. XXXX:00402A93  CMP  ECX,EAX                       ;fin de la boucle ?
  453. XXXX:00402A95  JAE  00402A61
  454. XXXX:00402A97  MOV  DWORD PTR [0040D0B4],00000008 ;nouvelle icone
  455. XXXX:00402AA1  XOR  EAX,EAX
  456. XXXX:00402AA3  POP  EDI
  457. XXXX:00402AA4  POP  ESI
  458. XXXX:00402AA5  ADD  ESP,00000800
  459. XXXX:00402AAB  RET                                ;fin du call 004029A0
  460.  
  461. Je rejoute donc quelques datas dans mon keyfile.
  462.  
  463. 00000150 36 37 3C 3E 3E 32 54 4A-52 32 35 35 3C 35 3C 3A    67<>>2TJR255<5<;
  464. 00000160 37 32 3E 37 35 3C 38 ??-?? ?? ?? ?? ?? ?? ?? ??    72>75<8.........
  465.  
  466. Ces datas proviennent directement de:
  467. [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
  468. "ProductId"="12799-OEM-0070752-92073"
  469.  
  470.  
  471. ===================================================
  472. 14. PARTIE 11/17 - CALL 00402AC0 (en XXXX:00401CAA)
  473. ===================================================
  474.  
  475. Objectif: sortir du call avec EAX=1
  476.  
  477. XXXX:00402B70  MOVSX EAX,CX                       ;CX vaut initialement 1
  478. XXXX:00402B73  INC  CX
  479. XXXX:00402B75  MOVSX EDX,BYTE PTR [EAX+ESP+3B]    ;pointe vers le debut de notre keyfile
  480. XXXX:00402B7A  ADD  EBX,EDX
  481. XXXX:00402B7C  CMP  CX,64                         ;64d = 100d
  482. XXXX:00402B80  JLE  00402B70                      ;boucle
  483. XXXX:00402B82  XOR  EBX,000007CF
  484.  
  485. La division euclidienne de EBX par 10 doit Ωtre Θgal α la valeur d'un certain octet de notre
  486. keyfile, On en dΘduit que EBX div 10 = 255 (soit FF, au maximum, sinon τa dΘpasse d'un octet,
  487. autrement dit, EBX ne doit pas dΘpasser 0x9FF). Voir remarque ci dessous.
  488.  
  489. J'ai donc rempli α ma convenance les parties non utilisΘes du keyfile.
  490.  
  491. XXXX:00402BA2  MOV  EAX,EBX                       ;somme des 100 premiers caractΦres
  492. XXXX:00402BA4  SUB  EDX,EDX
  493. XXXX:00402BA6  DIV  ECX                           ;ECX=0000000A
  494. XXXX:00402BA8  MOVSX ECX,BYTE PTR [ESP+000003EC]
  495. XXXX:00402BB0  MOV  [0040D1A8]
  496. XXXX:00402BB5  CMP  EAX,ECX                       ;cmp ZZ,EAX
  497. XXXX:00402BB7  JZ   00402BC5                      ;il faut que τa soit Θgal!
  498. ...
  499. XXXX:00402BC5  MOV  DWORD PTR [0040D0B4],00000009 ;nouvelle icone
  500. XXXX:00402BCF  MOV  EAX,00000001
  501. XXXX:00402BD4  POP  EDI
  502. XXXX:00402BD5  POP  ESI
  503. XXXX:00402BD6  POP  EBX
  504. XXXX:00402BD7  ADD  ESP,00000800
  505. XXXX:00402BDD  RET                                ;fin du call 00402AC0
  506.  
  507. 000003B0 ZZ ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??    ................
  508.  
  509. ZZ= est le rΘsultat (un octet) de la division euclidienne (pour moi c'est ZZ=3B)
  510.  
  511. Remaque: ZZ=00 n'est pas un cas trΦs interessant, je vais l'ignorer.
  512. Choissisez un octet entre 10 et 7Fh=127d, car si par exemple vous avez ZZ=0xF0 alors l'instruction
  513. MOVSX  ECX,F0 aura pour rΘsultat ECX=FFFFFFF0.
  514. (attention MOVSX <> MOVZX) et si ZZ<0xA on ne pourra pas continuer.
  515. Un conseil pour le choix de ZZ: pas un trop gros nombre.
  516.  
  517.  
  518. ===================================================
  519. 15. PARTIE 12/17 - CALL 00402BE0 (en XXXX:00401CB8)
  520. ===================================================
  521.  
  522. On doit avoir EAX=1 en sortant du call. Cette procedure ressemble beaucoup α la prΘcΘdente, on
  523. peut la considΘrer comme un addon.
  524.  
  525. XXXX:00402CD2  DIV  ECX                           ;ECX=54, effectue ZZ▓ DIV ECX
  526. XXXX:00402CD4  MOVSX EDX,BYTE PTR [ESP+000003ED]  ;lit un caractΦre de notre keyfile
  527. XXXX:00402CDC  MOV  [0040D1AC],EAX                ;YY
  528. XXXX:00402CE1  CMP  EDX,EAX                       ;on doit avoir EAX=EDX
  529. XXXX:00402CE3  JZ   00402CF1
  530. ...
  531. XXXX:00402CF1  MOV  DWORD PTR [0040D0B4],0000000A ;nouvelle icone, la 10Φme!
  532. XXXX:00402CFB  MOV  EAX,00000001
  533. XXXX:00402D00  POP  EDI
  534. XXXX:00402D01  POP  ESI
  535. XXXX:00402D02  POP  EBX
  536. XXXX:00402D03  ADD  ESP,00000800
  537. XXXX:00402D09  RET                                ;fin du call 00402BE0
  538.  
  539. 000003B0 ZZ YY ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??    ................
  540.  
  541. YY = ZZ▓ div 54 (YY et ZZ sont deux octets, et ZZ>9 (9h*9h=51h) )
  542.  
  543. Remaque: YY=00 n'est pas un cas trΦs interessant, je vais l'ignorer.
  544.          on doit avoir (ZZ▓ div 54) > YY
  545.  
  546.  
  547. ===================================================
  548. 16. PARTIE 13/17 - CALL 00402D10 (en XXXX:00401CC6)
  549. ===================================================
  550.  
  551. XXXX:00402DFD  MOVSX ECX,BYTE PTR [EAX+ESP+3B]    ;le dΘbut du keyfile
  552. XXXX:00402E02  ADD  ESI,ECX                       ;esi est initialement nul
  553. XXXX:00402E04  INC  EAX                           ;eax est initialement nul
  554. XXXX:00402E05  CMP  EAX,00000180                  ;180h = 384d
  555. XXXX:00402E0A  JBE  00402DFD                      ;boucle
  556. XXXX:00402E0C  MOV  EDI,EAX
  557. ...
  558. XXXX:00402E1A  IMUL EAX,EDI                       ;YY*ZZ
  559. XXXX:00402E1D  XOR  EAX,ESI                       ;esi somme des 384 caractΦres = SUM
  560. XXXX:00402E1F  MOV  ECX,00000216
  561. XXXX:00402E24  SUB  EDX,EDX                       ;xor edx,edx
  562. XXXX:00402E26  DIV  ECX
  563. XXXX:00402E28  MOVSX EDX,BYTE PTR [ESP+000003EE]
  564. XXXX:00402E30  MOV  [0040D1B0],EAX                ;TT
  565. XXXX:00402E35  CMP  EDX,EAX                       ;cmp TT,EAX
  566. XXXX:00402E37  JZ   00402E45
  567.  
  568. 000003B0 ZZ YY TT ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??    ................
  569.  
  570. XXXX:00402E45  MOV  DWORD PTR [0040D0B4],0000000B ;encore une nouvelle icone
  571. XXXX:00402E4F  MOV  EAX,00000001
  572. XXXX:00402E54  POP  EDI
  573. XXXX:00402E55  POP  ESI
  574. XXXX:00402E56  POP  EBX
  575. XXXX:00402E57  ADD  ESP,00000800
  576. XXXX:00402E5D  RET                                ;fin du call 00402D10
  577.  
  578. Remarque: en supposant que l'on veut TT non nul.
  579.           ( (YY*ZZ) XOR SUM ) div 216 = TT  avec forcΘment TT > YY
  580.  
  581. L'icone me sourit, c'est bon signe!
  582.  
  583.  
  584. ===================================================
  585. 17. PARTIE 14/17 - CALL 00402E60 (en XXXX:00401CD4)
  586. ===================================================
  587.  
  588. Ce call dΘpend directement des 3 calls qui prΘcΦdent, attention on en trouve pas une bonne
  589. combinaison au hasard!
  590.  
  591. XXXX:00402F07  MOV  EAX,[0040D1B0]                ;TT
  592. XXXX:00402F0C  MOV  ECX,[0040D1AC]                ;YY (dΘpend des 64h premiers octets du keyfile)
  593. XXXX:00402F12  MOV  ESI,[0040D1A8]                ;ZZ (dΘpend des 64h premiers octets du keyfile)
  594. ...
  595. [...]
  596. ...
  597. XXXX:00402F38  MOVSX EDX,BYTE PTR [ESP+000003EB]
  598. XXXX:00402F40  MOV  [040D1B4],EAX                 ;UU
  599. XXXX:00402F45  CMP  EDX,EAX
  600. XXXX:00402F47  JZ   00402F54
  601.  
  602. Qu'est-ce que fait [...] ?
  603. Il faut que  (TT div YY)*(ZZ div YY)*(TT+YY+ZZ) <> 0  ===> TT > YY et ZZ > YY
  604.  
  605. XXXX:00402F54  MOV  DWORD PTR [0040D0B4],0000000C
  606. XXXX:00402F5E  MOV  EAX,00000001
  607. XXXX:00402F63  POP  EDI
  608. XXXX:00402F64  POP  ESI
  609. XXXX:00402F65  ADD  ESP,00000800
  610. XXXX:00402F6B  RET                                ;fin du call 00402E60
  611.  
  612.  
  613. ===================================================
  614. 18. PARTIE 15/17 - CALL 00402F70 (en XXXX:00401CE2)
  615. ===================================================
  616.  
  617. Il se ressert de la boucle "180h" (voir plus haut, chapitre 16.)
  618.  
  619. XXXX:0040303B  DIV  ECX                          ;ECX=1F4
  620. XXXX:0040303D  MOVSX EDX,BYTE PTR [ESP+000003F0] ;l'octet un octet provenant de notre keyfile
  621. XXXX:00403045  MOV  [0040D1B8],EAX               ;VV
  622. XXXX:0040304C  JZ   0040305D                     ;on doit empreinter ce saut
  623. ...
  624. XXXX:0040305D  MOV  DWORD PTR [0040D0B4],000000D
  625. XXXX:00403067  XOR  EAX,EAX
  626. XXXX:00403069  POP  EDI
  627. XXXX:0040306A  POP  ESI
  628. XXXX:0040306B  POP  EBX
  629. XXXX:0040306C  ADD  ESP,00000800
  630. XXXX:00403072  RET                                 ;fin du call 00402F70
  631.  
  632.  
  633. ===================================================
  634. 19. PARTIE 16/17 - CALL 00403080 (en XXXX:00401CF0)
  635. ===================================================
  636.  
  637. Courage, c'est trΦs trΦs bient⌠t la fin!!!!!
  638.  
  639. XXXX:00403127  MOV  ECX,[0040D1B8]                 ;VV
  640. XXXX:0040312D  ADD  ECX,[0040D1B4]                 ;UU
  641. XXXX:00403133  ADD  ECX,[0040D1B0]                 ;TT
  642. XXXX:00403139  ADD  ECX,[0040D1AC]                 ;YY
  643. XXXX:0040313F  ADD  ECX,[0040D1A8]                 ;ZZ
  644. XXXX:00403145  MOV  [ESP+18],ECX                   ;pour moi j'obtiens: DA
  645. XXXX:00403149  MOV  DWORD PTR [ESP+1C],00000000
  646. XXXX:00403151  MOV  QWORD PTR [ESP+18]             ;calcul flottant sur 64 bits
  647. XXXX:00403155  FSQRT                               ;racine carrΘ (instruction du co-processeur)
  648. XXXX:00403157  CALL 0040420C                       ;rΘsultat de l'opΘration en EAX
  649. XXXX:0040315C  MOVSX ECX,BYTE PTR [ESP+000003ED]
  650. XXXX:00403164  CMP  EAX,ECX
  651. XXXX:00403166  JZ   00403173
  652. ...
  653. XXXX:00403173  MOV  DWORD PTR [0040D0B4],0000000E
  654. XXXX:0040317D  MOV  EAX,00000001
  655. XXXX:00403182  POP  EDI
  656. XXXX:00403183  POP  ESI
  657. XXXX:00403184  ADD  ESP,00000800
  658. XXXX:0040318A  RET                                 ;fin du call 00403080
  659.  
  660. Un exemple: 0xDA = 218 et racine carrΘ(218)=14.7648.. on arrandit α 14 (valeur plancher)
  661. soit 0xE, et c'est le rΘsultat α trouver.
  662.  
  663. DerniΦre icone!!!
  664.  
  665.  
  666. ===================================================
  667. 20. PARTIE 17/17 - CALL 00403080 (en XXXX:00401CF0)
  668. ===================================================
  669.  
  670. Dernier call, c'est trΦs facile, il vΘrifie si le dernier caractΦre du keyfile est bien un "R"
  671.  
  672. XXXX:00403237  CMP  BYTE PTR [ESP+00000437],52     ;52 ("R")
  673. XXXX:0040323F  JZ   0040324C
  674. ...
  675. XXXX:0040324C  MOV  DWORD PTR [0040D0B4],0000000F
  676. XXXX:00403256  MOV  EAX,00000001
  677. XXXX:0040325B  POP  EDI
  678. XXXX:0040325C  POP  ESI
  679. XXXX:0040325D  ADD  ESP,00000800
  680. XXXX:00403263  RET                                 ;fin du call 00403080
  681.  
  682. On a fini!!!!!!!!!!
  683.  
  684.  
  685. ==============
  686. 21. CONCLUSION
  687. ==============
  688.  
  689. J'ai mis du temp α trouver que le nom Θtait Θcrit α l'offset 9A (soit le 9B Φme octet du keyfile)
  690. et qu'il devait se terminer par 00 (un octet nul), sinon la pile dΘborde, et on a des problΦmes!!!!
  691. Dans ces call:
  692. 4. LA SURPRISE!
  693. 12. PARTIE 09/17 - CALL 004028A0 (en XXXX:00401C8E)
  694. 13. PARTIE 10/17 - CALL 004029A0 (en XXXX:00401C9C)
  695.  
  696. MoralitΘ, ce crackme est quand mΩme relativement dur, mais on peut quand mΩme y arriver!
  697.  
  698. Lucifer48, le 27 mai 1999
  699.  
  700. PS: C'est vrai que en y repenssant, τa me paraissait bizarre de gΘrer volontairement le
  701. dΘbordement de la pile, avec un langage de haut niveau tel que le C++. J'avoue que
  702. l'instruction REPNZ SCASB aurait du me mettre sur la bonne piste plus t⌠t, τa m'apprendra α
  703. remplir mon keyfile avec des octets 33!!!
  704.